//
// Created by feng on 19-4-14.
//

#ifndef SOLARENERGY_CHIER_RAYTRACINGARGUMENTSTRUCT_H
#define SOLARENERGY_CHIER_RAYTRACINGARGUMENTSTRUCT_H

// #include "SolarScene.h"
#include <cuda_runtime.h>

namespace solar::cuda
{
    struct SunrayArgument
    {
            float3* d_samplelights;  // 用于光线的随机采样
            float3* d_perturbations; // 用于slopeerror的随机采样
            int pool_size; // 随机数池的大小，即d_samplelights和d_perturbation的大小
            int numberOfLightsPerGroup; // 每个光锥的光线数目
            float3 sunray_direction;
            SunrayArgument() : d_samplelights(nullptr), d_perturbations(nullptr) {}

            SunrayArgument(float3* samplelights, float3* perturbations, int pool_size_,
                           int lightsPerGroup, float3 sunray_dir)
                : d_samplelights(samplelights), d_perturbations(perturbations),
                  pool_size(pool_size_), numberOfLightsPerGroup(lightsPerGroup),
                  sunray_direction(sunray_dir)
            {
            }

            ~SunrayArgument()
            {
                d_perturbations = nullptr;
                d_samplelights = nullptr;
            }
    };

    struct HeliostatArgument
    {
            //    float3 *d_heliostat_pos;
            //    float3 *d_heliostat_normals;
            int helionums; // 整个场景内子定日镜的个数-----相当于把子定日镜看做单独的定日镜进行处理
            int micronums; // 每个子定日镜包含的微定日镜个数
            int row;       // 每个子定日镜上微定日镜的行数
            int col;       // 每个子定日镜上微定日镜的列数
            float pixel;   // 微定日镜的边长
            float sizex;   // 子定日镜的长度
            float sizey;   // 子定日镜的高度==定日镜的高度（厚度）
            float sizez;   // 子定日镜的宽度
            int* subHeliostat_id; // 一个定日镜包含的全部微定日镜的id

            HeliostatArgument()
                : helionums(0), micronums(0), row(0), col(0), pixel(0), sizex(0), sizey(0),
                  sizez(0), subHeliostat_id(nullptr)
            {
            }

            HeliostatArgument(int helionumss, int micronumss, int rows, int cols, float pixels,
                              float sizexx, float sizeyy, float sizezz, int* id)
                : helionums(helionumss), micronums(micronumss), row(rows), col(cols), pixel(pixels),
                  sizex(sizexx), sizey(sizeyy), sizez(sizezz), subHeliostat_id(id)
            {
            }
    };
} // namespace solar::cuda

#endif // SOLARENERGY_CHIER_RAYTRACINGARGUMENTSTRUCT_H
